<?php
/**
 * HTTP请求类模块
 * 
 * @author jlpay-sdk-php
 * @version 1.0.0
 */

namespace JLPay\Core\Http;

/**
 * HTTP请求类
 */
class HttpRequest
{
    /**
     * 请求URL
     * @var string|null
     */
    public $url;
    
    /**
     * HTTP方法
     * @var string
     */
    public $method;
    
    /**
     * 请求头
     * @var array
     */
    public $headers;
    
    /**
     * URL参数
     * @var array|null
     */
    public $params;
    
    /**
     * 请求体
     * @var mixed
     */
    public $body;
    
    /**
     * 上传文件
     * @var array|null
     */
    public $files;
    
    /**
     * 从Builder创建HttpRequest实例
     * 
     * @param HttpRequestBuilder $builder HttpRequestBuilder实例
     */
    public function __construct(HttpRequestBuilder $builder)
    {
        $this->url = $builder->getUrl();
        $this->method = $builder->getMethod();
        $this->headers = $builder->getHeaders();
        $this->params = $builder->getParams();
        $this->body = $builder->getBody();
        $this->files = $builder->getFiles();
    }
    
    /**
     * 返回一个新的HttpRequestBuilder实例
     * 
     * @return HttpRequestBuilder
     */
    public static function builder(): HttpRequestBuilder
    {
        return new HttpRequestBuilder();
    }
    
    /**
     * 获取请求URL
     * 
     * @return string|null
     */
    public function getUrl(): string
    {
        return $this->url;
    }
    
    /**
     * 获取HTTP方法
     * 
     * @return string
     */
    public function getMethod(): string
    {
        return $this->method;
    }
    
    /**
     * 获取请求头
     * 
     * @return array
     */
    public function getHeaders(): array
    {
        return $this->headers;
    }
    
    /**
     * 获取URL参数
     * 
     * @return array|null
     */
    public function getParams()
    {
        return $this->params;
    }
    
    /**
     * 获取请求体
     * 
     * @return mixed
     */
    public function getBody(): array
    {
        return $this->body;
    }
    
    /**
     * 获取上传文件
     * 
     * @return array|null
     */
    public function getFiles()
    {
        return $this->files;
    }

    /**
     * 设置URL
     *
     * @param string $url
     */
    public function setUrl(string $url): void
    {
        $this->url = $url;
    }

    /**
     * 设置方法
     *
     * @param string $method
     */
    public function setMethod(string $method): void
    {
        $this->method = $method;
    }

    /**
     * 设置请求头
     *
     * @param array $headers
     */
    public function setHeaders(array $headers): void
    {
        $this->headers = $headers;
    }

    /**
     * 添加请求头
     *
     * @param string $key
     * @param string $value
     */
    public function addHeader(string $key, string $value): void
    {
        $this->headers[$key] = $value;
    }

    /**
     * 设置请求体
     *
     * @param array $body
     */
    public function setBody(array $body): void
    {
        $this->body = $body;
    }
}

/**
 * HTTP请求构建器
 */
class HttpRequestBuilder
{
    /**
     * 请求URL
     * @var string|null
     */
    private $_url;

    /**
     * HTTP方法
     * @var string
     */
    private $_method;

    /**
     * 请求头
     * @var array
     */
    private $_headers;

    /**
     * URL参数
     * @var array|null
     */
    private $_params;

    /**
     * 请求体
     * @var mixed
     */
    private $_body;

    /**
     * 上传文件
     * @var array|null
     */
    private $_files;
    
    /**
     * 初始化Builder属性
     */
    public function __construct()
    {
        $this->_url = null;
        $this->_method = "POST";  // 默认使用POST
        $this->_headers = [];
        $this->_params = null;
        $this->_body = null;
        $this->_files = null;
    }
    
    /**
     * 设置URL
     * 
     * @param string $url
     * @return self
     */
    public function url(string $url): self
    {
        $this->_url = $url;
        return $this;
    }
    
    /**
     * 设置HTTP方法
     * 
     * @param string $method HTTP方法
     * @return self
     */
    public function method(string $method): self
    {
        $this->_method = strtoupper($method);
        return $this;
    }
    
    /**
     * 添加请求头
     * 
     * @param string $key 请求头名称
     * @param string $value 请求头值
     * @return self
     */
    public function header(string $key, string $value): self
    {
        $this->_headers[$key] = $value;
        return $this;
    }
    
    /**
     * 批量设置请求头
     * 
     * @param array $headers 请求头数组
     * @return self
     */
    public function headers(array $headers): self
    {
        $this->_headers = array_merge($this->_headers, $headers);
        return $this;
    }
    
    /**
     * 设置URL参数
     * 
     * @param array $params URL参数字典
     * @return self
     */
    public function params(array $params): self
    {
        $this->_params = $params;
        return $this;
    }
    
    /**
     * 设置请求体
     * 
     * @param mixed $body 请求体，可以是数组、字符串等
     * @return self
     */
    public function body(array $body): self
    {
        $this->_body = $body;
        return $this;
    }
    
    /**
     * 设置JSON请求体
     * 
     * @param mixed $data 要转换为JSON的数据
     * @return self
     */
    public function json($data): self
    {
        $this->_body = $data;
        $this->header('Content-Type', 'application/json; charset=utf-8');
        return $this;
    }
    
    /**
     * 设置上传文件
     * 
     * @param array $files 文件数组
     * @return self
     */
    public function files(array $files): self
    {
        $this->_files = $files;
        return $this;
    }
    
    /**
     * 获取URL
     * 
     * @return string|null
     */
    public function getUrl(): string
    {
        return $this->_url;
    }
    
    /**
     * 获取HTTP方法
     * 
     * @return string
     */
    public function getMethod(): string
    {
        return $this->_method;
    }
    
    /**
     * 获取请求头
     * 
     * @return array
     */
    public function getHeaders(): array
    {
        return $this->_headers;
    }
    
    /**
     * 获取URL参数
     * 
     * @return array|null
     */
    public function getParams()
    {
        return $this->_params;
    }
    
    /**
     * 获取请求体
     * 
     * @return mixed
     */
    public function getBody(): array
    {
        return $this->_body;
    }
    
    /**
     * 获取上传文件
     * 
     * @return array|null
     */
    public function getFiles()
    {
        return $this->_files;
    }
    
    /**
     * 构建HttpRequest实例
     * 
     * @return HttpRequest
     */
    public function build(): HttpRequest
    {
        return new HttpRequest($this);
    }
} 